﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>TreeView (GUI)</title>
<meta name="description" content="Create TreeView controls easily with this free scripting language. Includes context menus, icons, and optional ListView companion controls.">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/commands.css" rel="stylesheet" type="text/css">
<link href="../css/print.css" rel="stylesheet" type="text/css" media="print">
<style type="text/css">
<!--
h1 {font-size: 200%;}
hr {margin-bottom: 0em;}
-->
</style>
</head> <body> <h1>TreeView <span class="small80">[v1.0.44+]</span></h1>  <h2>目录</h2> <ul> <li><a href="#Intro">入门和简单示例</a></li> <li><a href="#Options">选项和样式</a></li> <li><a href="#BuiltIn">内置函数</a>: 1) <a href="#bifAddModifyDelete">添加/修改/删除项目</a>; 2) <a href="#bifGet">从 TreeView 中获取数据</a></li> <li><a href="#notify">G-Label 通告</a></li> <li><a href="#Remarks">备注</a></li> <li><a href="#Examples">更长的范例</a></li> </ul> <h2><a name="Intro"></a>入门和简单示例</h2> <p>Tree-View 通过在父项目下缩进它们的子项目来显示出项目的层级关系. 最常见的例子是资源管理器的驱动器和文件夹树.</p> <p>创建 TreeView 的语法为:</p> <p><strong><a name="GuiAdd"></a>Gui, Add, TreeView, <em>Options</em></strong></p> <p>这里是一个创建和显示一个简单项目层次结构的有效脚本:</p> <pre>Gui, Add, TreeView
<span class="red">P1</span> := <a href="#TV_Add">TV_Add</a>(&quot;First parent&quot;)
P1C1 := TV_Add(&quot;Parent 1&#39;s first child&quot;, <span class="red">P1</span>)  <em>; Specify P1 to be this item&#39;s parent.</em>
P2 := TV_Add(&quot;Second parent&quot;)
P2C1 := TV_Add(&quot;Parent 2&#39;s first child&quot;, P2)
P2C2 := TV_Add(&quot;Parent 2&#39;s second child&quot;, P2)
P2C2C1 := TV_Add(&quot;Child 2&#39;s first child&quot;, P2C2)

Gui, Show  <em>; Show the window and its TreeView.</em>
return

GuiClose:  <em>; Exit the script when the user closes the TreeView&#39;s GUI window.</em>
ExitApp</pre> <h2><a name="Options"></a>用于 &quot;<em>Gui, Add, TreeView, <u>Options</u></em>&quot; 的样式和选项</h2> <p><strong><a name="AltSubmit"></a>AltSubmit:</strong> 通知脚本有比正常更多的 TreeView 事件类型. 换言之, g-label 运行的更频繁.参见 <a href="#notify">TreeView 通告</a> 获取详情.</p> <p>Background: 指定单词 <strong>Background</strong> 接着一个颜色名称 (参见 <a href="Progress.htm#colors">颜色图表</a>) 或 RGB 值 (0x 前缀是可选的).例如: BackgroundSilver, BackgroundFFDD99. 如果此选项不存在, TreeView 最初默认的背景颜色由 <a href="Gui.htm#Color">Gui Color</a> (或者如果没有, 则使用系统默认的背景颜色) 的最后一个参数设置. 指定 BackgroundDefault 应用系统的默认背景颜色 (通常为白色).例如, 通过 <em>GuiControl, +BackgroundDefault, MyTreeView</em> 可以把 TreeView 恢复为默认的颜色.</p> <p><strong>Buttons</strong>: 指定 -Buttons (负 Buttons) 以避免在每个含有子项目的项目左边显示一个加号或减号按钮.</p> <p><strong>C</strong>: 文本颜色. 指定字母 C 接着一个颜色名称 (参见 <a href="Progress.htm#colors">颜色图表</a>) 或 RGB 值 (0x 前缀是可选的).例如: cRed, cFF2211, c0xFF2211, cDefault</p> <p><strong><a name="Checked"></a>Checked:</strong> 在每项的左边提供一个复选框. 当 <a href="#TV_Add">添加</a> 一项时, 在其选项中指定单词 <em>Check</em> 使复选框初始为选中而不是未选中状态. 用户可以点击复选框或按下空格键来选中或取消选中一项. 要找出 TreeView 中当前选中了哪些项目, 请调用 <a href="#TV_GetNext">TV_GetNext()</a> 或 <a href="#TV_Get">TV_Get()</a>. </p> <p><strong>HScroll</strong>: 指定 -HScroll (负 HScroll) 来禁用控件中的水平滚动 (此外, 控件将不显示水平滚动条). 在比 Windows 2000/Me 老的操作系统中, 此选项没有效果除非系统中有 Comctl32.dll 5.8 或更高版本 (随应用程序例如 Internet Explorer 5 或更高版本一起发布).</p> <p><strong><a name="ImageList"></a>ImageList</strong>: 这是通过它把图标添加到 TreeView 的方法. 指定单词 <em>ImageList</em> 接着之前调用 <a href="ListView.htm#IL_Create">IL_Create()</a> 返回的 ImageListID. 此选项仅当创建 TreeView 时才有效果. 这里是一个有效的示例:</p> <pre>ImageListID := <a href="ListView.htm#IL_Create">IL_Create</a>(10)  <em>; Create an ImageList with initial capacity for 10 icons.</em>
Loop 10  <em>; Load the ImageList with some standard system icons.</em>
    <a href="ListView.htm#IL_Add">IL_Add</a>(ImageListID, &quot;shell32.dll&quot;, A_Index)  <em>; Omits the DLL&#39;s path so that it works on Windows 9x too.</em>
Gui, Add, TreeView, <strong>ImageList%ImageListID%</strong>
<a href="#TV_Add">TV_Add</a>(&quot;Name of Item&quot;, 0, &quot;Icon4&quot;)  <em>; Add an item to the TreeView and give it a folder icon.</em>
Gui Show</pre> <p><strong>Lines</strong>: 指定 -Lines (负 Lines) 来避免显示连接父项目和它们的子项目的网状线. 但是, 移除这些线也阻止了顶级项目左边加号/减号按钮的显示.</p> <p><strong><a name="ReadOnly"></a>ReadOnly:</strong> 指定 -ReadOnly (负 ReadOnly) 来允许编辑每项的文本/名称. 要编辑某项, 选择它接着按下 <a href="#WantF2">F2 键</a>. 或者, 你可以对一个项目点击一次来选择它, 至少等待半秒钟, 然后再次点击同一项目进行编辑. 编辑后, 一个项目可以在其同级项目之间按字母顺序重新定位, 请参考下面的例子:</p> <pre>Gui, Add, TreeView, -ReadOnly <a href="#notify">gMyTree</a>
<em>; ...</em>
MyTree:
if (A_GuiEvent == &quot;e&quot;)  <em>; The user has finished editing an item (use == for case sensitive comparison).</em>
    TV_Modify(TV_GetParent(A_EventInfo), &quot;Sort&quot;)  <em>; This works even if the item has no parent.</em>
return
</pre> <p><strong>R</strong>: 行高 (创建时).指定字母 R 接着为在控件中留出空间的行数. 例如, R10 将使控件为 10 个项目的高度.</p> <p><strong><a name="WantF2"></a>WantF2</strong>: 指定 -WantF2 (负 WantF2) 来禁止使用 F2 键击 <a href="#ReadOnly">编辑</a> 当前选择的项目. 仅当 <a href="#ReadOnly">-ReadOnly</a> 也有效时此设置才不会被忽略.不论此设置如何, g-label 仍会接收到 F2 <a href="#NotifyK">通告</a>.</p> <p><strong>(未命名的数字样式):</strong> 由于上述以外的其他样式很少使用, 它们没有名称.参见 <a href="../misc/Styles.htm#TreeView">TreeView 样式表</a> 了解这些样式.</p> <h2><a name="BuiltIn"></a>TreeViews 中的内置函数</h2> <p>所有的 TreeView 函数操作于当前线程的 <a href="Gui.htm#DefaultWin">默认 GUI 窗口</a> (这可以通过 <a href="Gui.htm#Default"><em>Gui, 2:Default</em></a> 改变). 如果默认窗口不存在或不含有 TreeView 控件, 所有函数返回 0 来表明此问题.</p> <p><a name="GuiTV"></a>如果窗口含有多个 TreeView 控件, 默认情况下函数操作于最近添加的那个. 要改变这种情况, 请指定 <em>Gui, TreeView, TreeViewName</em>, 此处 <em>TreeViewName</em> 为 TreeView 的 <a href="Gui.htm#var">关联变量</a> 的名称或 Window Spy 中显示的其 ClassNN. 一旦改变后, 所有现有和将来的 <a href="../misc/Threads.htm">线程</a> 将使用指定的 TreeView.</p> <h2><a name="bifAddModifyDelete"></a>添加, 修改, 和删除项目</h2> <p><strong><a name="TV_Add"></a>TV_Add(Name, [ParentItemID, Options]):</strong> 添加一个新项到 TreeView 并且返回其唯一的 项目 ID 号 (当失败时返回 0). <em>Name</em> 为被显示的项目文本, 其可以为文本或数字 (包括数值的 <a href="../Variables.htm#Expressions">表达式</a> 结果). <em>ParentItemID</em> 为新项目的父项的 ID 号 (忽略它或指定 0 来添加项目到顶级). 当添加大量项目时, 在添加项目前使用 <em>GuiControl, -Redraw, MyTreeView</em> 并且在添加项目后使用 <em>GuiControl, +Redraw, MyTreeView</em> 可以提升性能.</p> <p><span class="greenbold">TV_Add() 和 TV_Modify() 的选项:</span> <em>选项</em> 参数是一个包含零个或多个下面列表中单词的字符串 (不区分大小写). 单词间使用空格或制表符分隔.要移除一个选项, 请在选项前加上一个负号.要添加一个选项, 可以在选项前加上一个正号但不是必需的.</p> <p><span class="green"><a name="Bold"></a>Bold</span>: 用粗体显示项目的名称. 要在以后取消项目名称的粗体显示, 请使用 <em>TV_Modify(ItemID, &quot;-Bold&quot;)</em>.</p> <p><span class="green"><a name="Check"></a>Check</span>: 在项目的左边显示一个复选标记 (需要 TreeView 含有 <a href="#Checked">复选框</a>). 要在以后取消复选它, 请使用 <em>TV_Modify(ItemID, &quot;-Check&quot;)</em>. 在单词 <em>Check</em> 后可选跟着一个 0 或 1 来表示初始状态. 换言之, <em>&quot;Check&quot;</em> 和 <em>&quot;Check&quot; <strong>.</strong> </em><em>VarContainingOne</em> 是相同的 (这里中间使用的是 <a href="../Variables.htm#concat">连接运算符</a>).</p> <p><span class="green"><a name="Expand"></a>Expand</span>: 展开此项目来显示其子项目 (如果有的话). 以后要折叠项目, 请使用 <em>TV_Modify(ItemID, &quot;-Expand&quot;)</em>. 如果没有子项目, <a href="#TV_Modify">TV_Modify()</a> 返回 0 而不是项目 ID. 相比之下, <a href="#TV_Add">TV_Add()</a> 标记此项目为展开的以防以后要添加子项目. 与 &quot;Select&quot; (下面的) 不同, 展开一个项目不会自动展开其父项目. 最后, 在单词 <em>Expand</em> 后可选跟着一个 0 或 1 来表示初始状态. 换言之, <em>&quot;Expand&quot;</em> 和 <em>&quot;Expand&quot; <strong>.</strong> </em><em>VarContainingOne</em> 是相同的.</p> <p><span class="green">First | Sort | N</span>: 这些选项仅适用于 <a href="#TV_Add">TV_Add()</a>. 它们指定新项目相对于其同级项目的位置 (此处 <em>同级项目</em> 是同一级别的其他任何项目). 如果这些选项都不存在, 新项目被添加到同级项目的最后一个/底部. 否则, 指定 <em>First</em> 添加项目到同级项目的第一个/顶部, 或指定 <em>Sort</em> 按字母顺序插入新项目到同级项目中间. 如果指定一个普通的整数 (<strong>N</strong>), 则假定为同级项目的 ID 号, 新项目在其后插入 (如果整数 N 是唯一存在的选项, 它不需要包含在引号中).</p> <p><span class="green">Icon</span>: 指定单词 <em>Icon</em> 接着此项目图标的编号, 项目图标显示在项目名称的左边. 如果此选项不存在, 则使用 <a href="#ImageList">ImageList</a> 中的首个图标.要显示一个空白图标, 指定一个大于 ImageList 中图标编号的数字.如果控件没有 ImageList, 则既不显示图标也不为图标保留空间.</p> <p><span class="green"><a name="Select"></a>Select</span>: 选择项目. 因为一次只能选择一个项目, 此时任何原来选择的项目会自动取消选择. 此外, 如果有必要此选项会展开其父项目以显示新选择的项目. 要找出当前的选择, 请调用 <a href="#TV_GetSelection">TV_GetSelection()</a>.</p> <p><span class="green">Sort</span>: 对于 <a href="#TV_Modify">TV_Modify()</a>, 此选项按字母顺序排列指定项目的子项目. 要排序所有顶级项目, 请使用 <em>TV_Modify(0, &quot;Sort&quot;)</em>. 如果不含子项目, 返回 0 而不是所修改的项目  ID.</p> <p><span class="green">Vis</span>: 通过滚动 TreeView 和/或展开其父项目 (如果必要) 确保此项完全可见.</p> <p><span class="green">VisFirst</span>: 和上面一样, 除了滚动 TreeView 使得此项显示在最上面, 如果可能的话. 此选项与 <a href="#TV_Modify">TV_Modify()</a> 一起使用比与 <a href="#TV_Add">TV_Add()</a> 通常更有效.</p> <p><strong></strong><br><strong> <a name="TV_Modify"></a>TV_Modify(ItemID [, Options, NewName]):</strong> 修改一个项目的属性和/或名称. 成功时它返回项目自己的 ID 而失败 (或部分失败) 时返回 0. 如果仅存在首个参数, 则 <a href="#Select">选择</a> 指定的项目. 如果省略 <em>NewName</em>, 则当前名称保持不变. 了解 <em>选项</em>, 参见上面的列表.</p> <p><strong><a name="TV_Delete"></a>TV_Delete([ItemID]):</strong> 如果省略 <em>ItemID</em>, 则删除 TreeView 中 <strong>所有</strong> 项目. 否则, 仅删除指定 <em>ItemID</em> 所在的项目. 成功时返回 1 而失败返回 0.</p> <h2><a name="bifGet"></a>从 TreeView 中获取数据</h2> <p><strong><a name="TV_GetSelection"></a>TV_GetSelection():</strong> 返回选择项目的 ID 号.</p> <p><strong><a name="TV_GetCount"></a>TV_GetCount():</strong> 返回控件中项目的总数. 此函数总是即时的因为控件跟踪此计数.</p> <p><strong><a name="TV_GetParent"></a>TV_GetParent(ItemID):</strong> 返回指定项目的父项目的  ID. 顶级项目没有父项目因此返回 0.</p> <p><strong><a name="TV_GetChild"></a>TV_GetChild(ParentItemID):</strong> 返回指定项目的第一个/最上面的 子项目的 ID 号 (如果没有则为 0).</p> <p><strong><a name="TV_GetPrev"></a>TV_GetPrev(ItemID)</strong>: 返回指定项目上面一个的同级项目的 ID 号 (如果没有则为 0).</p> <p><strong><a name="TV_GetNext"></a>TV_GetNext([ItemID, &quot;Checked | Full&quot;]):</strong> 此函数含有以下模式:</p> <ol> <li>省略所有参数时, 它返回 TreeView 中第一个/最上面的项目的 ID 号 (如果没有则为 0).</li> <li>如果仅存在首个参数 (ItemID), 它返回指定项目下面一个的同级项目的 ID 号 (如果没有则为 0). 如果首个参数为 0, 它返回 TreeView 中第一个/最上面的项目的 ID 号 (如果没有则为 0).</li> <li>当第二个参数为 &quot;Full&quot; 或 &quot;F&quot;, 则获取下一个项目, 不论是否是指定项目的同级项目. 这使得脚本可以容易的逐项遍历整个树. 例如:<pre>ItemID = 0  <em>; Causes the loop&#39;s first iteration to start the search at the top of the tree.</em>
Loop
{
    ItemID := TV_GetNext(ItemID, &quot;Full&quot;)  <em>; Replace &quot;Full&quot; with &quot;Checked&quot; to find all checkmarked items.</em>
    if not ItemID  <em>; No more items in tree.</em>
break
    TV_GetText(ItemText, ItemID)
    MsgBox The next Item is %ItemID%, whose text is &quot;%ItemText%&quot;.
}</pre> </li> <li>当第二个参数为 &quot;Check&quot;, &quot;Checked&quot;, 或 &quot;C&quot;, 与上面行为相同, 除了跳过任何没有复选标记的项目. 这使得可以逐个获取 TreeView 中所有含有复选标记的项目.</li> </ol> <p><strong><a name="TV_GetText"></a>TV_GetText(OutputVar, ItemID):</strong> 获取指定 <em>ItemID</em> 的文本/名称并保存到 <em>OutputVar</em> 中. 如果文本长于 8191, 则仅获取开始的 8191 个字符.成功时函数返回项目自己的 ID. 失败时返回 0 (并且 <em>OutputVar</em> 也被置空).</p> <p><strong><a name="TV_Get"></a>TV_Get(ItemID, &quot;Expand | Check | Bold&quot;):</strong> 如果指定的项目含有指定的属性, 则返回其自己的 <em>ItemID</em>. 否则返回 0. 在第二个参数中指定 &quot;E&quot;, &quot;Expand&quot;, 或 &quot;Expanded&quot; 以判断此项当前是 <a href="#Expand">展开的</a> (即其子项目是显示的); 指定 &quot;C&quot;, &quot;Check&quot;, 或 &quot;Checked&quot; 以判断此项含有 <a href="#Check">复选标记</a>; 或指定 &quot;B&quot; 或 &quot;Bold&quot; 以判断此项当前为 <a href="#Bold">粗体</a> 显示.</p> <p>提示: 因为在 IF声明 中把任何非零值视为 &quot;真&quot;, 下面两行功能相同:</p> <ol> <li>if TV_Get(ItemID, &quot;Checked&quot;) = ItemID</li> <li>if TV_Get(ItemID, &quot;Checked&quot;)</li> </ol> <h2><a name="notify"></a>G-Label 通告 (主要) </h2> <p>一个 <a href="Gui.htm#label">g-label</a> 例如 <em><strong>g</strong>MySubroutine</em> 可以使用在此控件选项中. 这使得当用户在控件中执行一个动作时 <em>MySubroutine</em> 标签会自动运行. 此子程序中可参考使用内置变量 <a href="../Variables.htm#Gui">A_Gui</a> 和 <a href="../Variables.htm#GuiControl">A_GuiControl</a> 来找出哪个窗口和 TreeView 产生的事件. 更重要的是, 它可以参考 <strong>A_GuiEvent</strong>, 其包含下列字符串或字母的其中一个 (考虑到和未来版本的兼容性, 一个脚本不应假定这些字符串或字母是唯一可能的值):</p> <p><strong>DoubleClick</strong>: 用户双击了一项. 变量 A_EventInfo 包含目标项目 ID.</p> <p><strong>D</strong>: 用户尝试开始拖动一个项目 (目前还没有内置对拖动项目的支持). 变量 A_EventInfo 包含目标项目 ID.</p> <p><strong>d</strong> (小写的 D): 和上面相同, 除了指右键拖动而不是左键拖动.</p> <p><strong>e</strong> (小写的 E): 用户完成编辑一个项目 (只有当 TreeView 选项中含有 <a href="#ReadOnly"><strong>-</strong>ReadOnly</a> 时用户才可以编辑项目). 变量 A_EventInfo 包含目标项目 ID.</p> <p><strong>S</strong>: 选择了一个新项目, 由用户或脚本自己选择的. 变量 A_EventInfo 包含新选择项目的 ID.</p> <h2>G-Label 通告 (次要)</h2> <p>如果 TreeView 的 <a href="#Options">选项</a> 中含有单词 AltSubmit, 其 g-label 会运行的更频繁并且 <strong>A_GuiEvent</strong> 可能包含下列附加的值:</p> <p><strong>Normal</strong>: 用户左键单击了一个项目.变量 A_EventInfo 包含目标项目 ID.</p> <p><strong>RightClick</strong>: 用户右键单击了一个项目. 变量 A_EventInfo 包含了目标项目 ID. 在大多数情况下, 最好不要显示一个菜单响应此通告. 而是使用 <a href="Gui.htm#GuiContextMenu">GuiContextMenu 标签</a> 因为它还能识别 Appskey.例如:</p> <pre>GuiContextMenu:  <em>; Launched in response to a right-click or press of the Apps key.</em>
if A_GuiControl &lt;&gt; MyTreeView  <em>; This check is optional. </em><em>It displays the menu only for clicks inside the TreeView.</em>
    return
<em>; Show the menu at the provided coordinates, A_GuiX and A_GuiY.  </em><em>These should be used</em>
<em>; because they provide correct coordinates even if the user pressed the Apps key:</em>
Menu, MyContextMenu, Show, %A_GuiX%, %A_GuiY%
return
</pre> <p><strong>E</strong>: 用户开始编辑一个项目 (只有当 TreeView 选项中含有 <a href="#ReadOnly">-ReadOnly</a> 时用户才可以编辑项目). 变量 A_EventInfo 包含目标项目 ID.</p> <p><strong>F</strong>: TreeView 接收到键盘焦点.</p> <p><strong>f</strong> (小写的 F): TreeView 失去了键盘焦点.</p> <p><strong><a name="NotifyK"></a>K</strong>: 当 TreeView 拥有焦点时用户按下了一个键. A_EventInfo 包含此键的虚拟按键代码, 它是介于 1 和 255 之间的一个数字.如果此键是字母键, 在大多数键盘布局中可以通过 <a href="../Functions.htm#Chr">Chr(A_EventInfo)</a> 把它转换成相应的字符.不论 <a href="#WantF2">WantF2</a> 如何都会接收到 F2 键击. 然而, 不会接收到 Enter 键击; 要接收它, 像 <a href="#Enter">下面</a> 描述的那样使用一个默认按钮.</p> <p><strong>+</strong> (加号): 展开了一个项目以显示其子项目. 变量 A_EventInfo 包含目标项目 ID.</p> <p><strong>-</strong> (减号): 折叠了一个项目以隐藏其子项目. 变量 A_EventInfo 包含目标项目 ID.</p> <h2>备注</h2> <p><a href="Gui.htm#Submit">Gui Submit</a> 命令对 TreeView 控件没有效果. 因此, 脚本可以使用 TreeView 的 <a href="Gui.htm#var">关联变量</a> (如果有的话) 来保存其他数据而不用担心它会被覆盖.</p> <p><a name="Enter"></a>当 TreeView 拥有焦点时如果要检测到用户按下的回车键, 请使用一个 <a href="GuiControls.htm#DefaultButton">默认按钮</a> (如果需要可以隐藏它). 例如:</p> <pre>Gui, Add, Button, Hidden Default, OK
...
ButtonOK:
GuiControlGet, FocusedControl, FocusV
if FocusedControl &lt;&gt; MyTreeView
    return
MsgBox % &quot;Enter was pressed. The selected item ID is &quot; . TV_GetSelection()
return
</pre> <p>为了用键盘在项与项之间导航, 用户还可以通过输入一个项目名称的前几个字符来执行增量搜索. 这使得选择对象跳转到最近匹配的项目.</p> <p>尽管 TreeView 中的每个项目可以存储任何长度的文本, 但仅显示开始的 260 个字符.</p> <p>尽管理论上 TreeView 中可以使用最大的项目数为 65536, 接近此数目时添加项的性能将显著降低. 通过使用 <a href="#TV_Add">TV_Add()</a> 中描述的重绘提示可以稍微减轻这种情况.</p> <p><a name="ILremarks"></a>与 <a href="ListView.htm">ListViews</a> 不同, 当 TreeView 销毁时其 ImageList 不会被自动销毁. 因此, 如果 TreeView 中使用的 ImageList 以后不再用于其他地方, 在销毁 TreeView 所在的窗口后脚本应该调用 <a href="ListView.htm#IL_Destroy">IL_Destroy(ImageListID)</a> 销毁此 ImageList. 然而, 如果脚本很快将退出这样做是没必要的因为那时所有的 ImageList 会被自动销毁. 相关提示, TreeView <a href="#ImageList">最初的 ImageList</a> 可以被替换为一个新的, 参照此例:</p> <pre>Gui <a href="Gui.htm#LastFound">+LastFound</a>
<a href="PostMessage.htm">SendMessage</a>, 0x1109, 0, NewImageListID, SysTreeView321  <em>; 0x1109 is TVM_SETIMAGELIST</em>
if ErrorLevel  <em>; The TreeView had a previous ImageList.</em>
    <a href="ListView.htm#IL_Destroy">IL_Destroy</a>(ErrorLevel)  <em>; Destroying it is the most typical action.</em></pre> <p>一个脚本可以在每个窗口中创建多个 TreeView. 要对非默认的 TreeView 进行操作, 请参见 <a href="#BuiltIn">内置函数</a>.</p> <p>要执行一些操作例如调整大小, 隐藏或改变 TreeView 的字体, 请使用 <a href="GuiControl.htm">GuiControl</a>.</p> <p> Tree View eXtension (TVX) 扩展了 TreeViews 的功能增加支持移动, 插入和删除. 演示的例子参见 <a href="http://www.autohotkey.com/forum/topic19021.html">www.autohotkey.com/forum/topic19021.html</a></p> <p>Windows 95 和 NT4: 如果系统缺少后面这些文件的 4.70 或更高版本: Comctl32.dll, Shell32.dll, and Shlwapi.dll -- 它们随各种更新和应用程序例如 Internet Explorer 3.0 或更高版本一起发布 -- TreeView 的功能受到更多限制并且某些特性可能不会和预期一样.</p> <h2>相关</h2> <p><a href="ListView.htm">ListView</a>, <a href="GuiControls.htm">其他控件类型</a>, <a href="Gui.htm">Gui</a>, <a href="Gui.htm#GuiContextMenu">GuiContextMenu</a>, <a href="GuiControl.htm">GuiControl</a>, <a href="GuiControlGet.htm">GuiControlGet</a>, <a href="../misc/Styles.htm#TreeView">TreeView 样式表</a></p> <h2>示例</h2> <pre class="NoIndent"><em>; The following is a working script that is more elaborate than the one near the top of this page.</em>
<em>; It creates and displays a TreeView containing all folders in the all-users Start Menu.  </em><em>When the</em>
<em>; user selects a folder, its contents are shown in a ListView to the right (like Windows Explorer).</em>
<em>; In addition, a <a href="GuiControls.htm#StatusBar">StatusBar</a> control shows information about the currently selected folder.</em>

<em>; The following folder will be the root folder for the TreeView. </em><em>Note that loading might take a long</em>
<em>; time if an entire drive such as C:\ is specified:</em>
TreeRoot = %A_StartMenuCommon%
TreeViewWidth := 280
ListViewWidth := A_ScreenWidth - TreeViewWidth - 30

<em>; Allow the user to maximize or drag-resize the window:</em>
Gui +Resize

<em>; Create an ImageList and put some standard system icons into it:</em>
ImageListID := <a href="ListView.htm#IL_Create">IL_Create</a>(5)
Loop 5  <em>; Below omits the DLL&#39;s path so that it works on Windows 9x too:</em>
    <a href="ListView.htm#IL_Add">IL_Add</a>(ImageListID, &quot;shell32.dll&quot;, A_Index)

<em>; Create a TreeView and a ListView side-by-side to behave like Windows Explorer:</em>
<a href="#GuiAdd">Gui, Add, TreeView</a>, vMyTree r20 w%TreeViewWidth% gMyTree <a href="#ImageList">ImageList</a>%ImageListID%
Gui, Add, ListView, vMyList r20 w%ListViewWidth% x+10, Name|Modified

<em>; Set the ListView&#39;s column widths (this is optional):</em>
Col2Width = 70  <em>; Narrow to reveal only the YYYYMMDD part.</em>
LV_ModifyCol(1, ListViewWidth - Col2Width - 30)  <em>; Allows room for vertical scrollbar.</em>
LV_ModifyCol(2, Col2Width)

<em>; Create a Status Bar to give info about the number of files and their total size:</em>
<a href="GuiControls.htm#StatusBar">Gui, Add, StatusBar</a>
<a href="GuiControls.htm#SB_SetParts">SB_SetParts</a>(60, 85)  <em>; Create three parts in the bar (the third part fills all the remaining width).</em>

<em>; Add folders and their subfolders to the tree. </em><em>Display the status in case loading takes a long time:</em>
SplashTextOn, 200, 25, TreeView and StatusBar Example, Loading the tree...
AddSubFoldersToTree(TreeRoot)
SplashTextOff

<em>; Display the window and return. </em><em>The OS will notify the script whenever the user performs an eligible action:</em>
Gui, Show,, %TreeRoot%  <em>; Display the source directory (TreeRoot) in the title bar.</em>
return

AddSubFoldersToTree(Folder, ParentItemID = 0)
{
    <em>; This function adds to the TreeView all subfolders in the specified folder.</em>
    <em>; It also calls itself recursively to gather nested folders to any depth.</em>
    Loop %Folder%\*.*, 2  <em>; Retrieve all of Folder&#39;s sub-folders.</em>
        AddSubFoldersToTree(A_LoopFileFullPath, <a href="#TV_Add">TV_Add</a>(A_LoopFileName, ParentItemID, &quot;Icon4&quot;))
}

MyTree:  <em>; This subroutine handles user actions (such as clicking).</em>
if A_GuiEvent &lt;&gt; S  <em>; i.e. an event other than &quot;select new tree item&quot;.</em>
    return  <em>; Do nothing.</em>
<em>; Otherwise, populate the ListView with the contents of the selected folder.</em>
<em>; First determine the full path of the selected folder:</em>
<a href="#TV_GetText">TV_GetText</a>(SelectedItemText, A_EventInfo)
ParentID := A_EventInfo
Loop  <em>; Build the full path to the selected folder.</em>
{
    ParentID := <a href="#TV_GetParent">TV_GetParent</a>(ParentID)
    if not ParentID  <em>; No more ancestors.</em>
        return
    TV_GetText(ParentText, ParentID)
    SelectedItemText = %ParentText%\%SelectedItemText%
}
SelectedFullPath = %TreeRoot%\%SelectedItemText%

<em>; Put the files into the ListView:</em>
LV_Delete()  <em>; Clear all rows.</em>
GuiControl, -Redraw, MyListView  <em>; Improve performance by disabling redrawing during load.</em>
FileCount = 0  <em>; Init prior to loop below.</em>
TotalSize = 0
Loop %SelectedFullPath%\*.*  <em>; For simplicity, this omits folders so that only files are shown in the ListView.</em>
{
    LV_Add(&quot;&quot;, A_LoopFileName, A_LoopFileTimeModified)
    FileCount += 1
    TotalSize += A_LoopFileSize
}
GuiControl, +Redraw, MyListView

<em>; Update the three parts of the status bar to show info about the currently selected folder:</em>
<a href="GuiControls.htm#SB_SetText">SB_SetText</a>(FileCount . &quot; files&quot;, 1)
SB_SetText(Round(TotalSize / 1024, 1) . &quot; KB&quot;, 2)
SB_SetText(SelectedFullPath, 3)
return

GuiSize:  <em>; Expand/shrink the ListView and TreeView in response to user&#39;s resizing of window.</em>
if A_EventInfo = 1  <em>; The window has been minimized.  </em><em>No action needed.</em>
    return
<em>; Otherwise, the window has been resized or maximized. </em><em>Resize the controls to match.</em>
GuiControl, Move, MyTree, % &quot;H&quot; . (A_GuiHeight - 30)  <em>; -30 for StatusBar and margins.</em>
GuiControl, Move, MyList, % &quot;H&quot; . (A_GuiHeight - 30) . &quot; W&quot; . (A_GuiWidth - TreeViewWidth - 30)
return

GuiClose:  <em>; Exit the script when the user closes the TreeView&#39;s GUI window.</em>
ExitApp</pre> </body> </html>